﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioAssunto
    {
        private IRepositorioAssunto _repositorioAssunto;

        /// <summary>
        /// 
        /// </summary>
        public NegocioAssunto()
        {
            _repositorioAssunto = new RepositorioAssunto();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="assunto"></param>
        /// <returns></returns>
        public Assunto Inserir(Assunto assunto)
        {
            assunto.Codigo = GeradorCodigo.GerarCodigo(1);
            assunto.Codigo += (_repositorioAssunto.ObterUltimoIdCodigoInteiro() + 1).ToString();
            assunto.Codigo += GeradorCodigo.GerarCodigo(1, assunto.Codigo);
            return _repositorioAssunto.Inserir(assunto);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="assunto"></param>
        /// <returns></returns>
        public Assunto Atualizar(Assunto assunto)
        {
            return _repositorioAssunto.Atualizar(assunto);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="assunto"></param>
        public void Excluir(Assunto assunto)
        {
            Assunto assuntoTmp = ObterPorId(assunto.AssuntoId);
            _repositorioAssunto.Excluir(assuntoTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<Assunto> ObterTodos(Usuario usuarioPermissao)
        {
            return _repositorioAssunto.ObterTodos();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Assunto ObterPorId(int id)
        {
            return _repositorioAssunto.ObterPorId(id);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="codigo"></param>
        /// <returns></returns>
        public Assunto ObterPorCodigo(string codigo, Usuario usuarioPermissao)
        {
            return _repositorioAssunto.ObterPorCodigo(codigo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="descricao"></param>
        /// <returns></returns>
        public IList<Assunto> ObterPorDescricao(string descricao)
        {
            return _repositorioAssunto.ObterPorDescricao(descricao);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="inicio"></param>
        /// <param name="quantidade"></param>
        /// <param name="quantidadeMinima"></param>
        /// <param name="usuarioPermissao"></param>
        /// <param name="codigo"></param>
        /// <param name="descricao"></param>
        /// <param name="tipoAssunto"></param>
        /// <param name="setor"></param>
        /// <param name="funcionario"></param>
        /// <param name="inicioVigenciaDe"></param>
        /// <param name="inicioVigenciaAte"></param>
        /// <param name="fimVigenciaDe"></param>
        /// <param name="fimVigenciaAte"></param>
        /// <returns></returns>
        public IList<Assunto> ObterTodosAssuntos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string codigo,
            string descricao, TipoAssunto tipoAssunto, Setor setor, Funcionario funcionario, DateTime? inicioVigenciaDe, 
            DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe, DateTime? fimVigenciaAte)
            {

                if (!inicioVigenciaAte.HasValue)
                {
                    inicioVigenciaAte = inicioVigenciaDe;
                }

                if (!fimVigenciaAte.HasValue)
                {
                    fimVigenciaAte = fimVigenciaDe;
                }

                return _repositorioAssunto.ObterTodos( inicio,  quantidade, quantidadeMinima,  codigo,
                 descricao,  tipoAssunto, setor, funcionario,  inicioVigenciaDe, inicioVigenciaAte, fimVigenciaDe,  fimVigenciaAte);
            }
    }
}